package ru.niir.goodfil.ui;

import org.apache.commons.lang.StringUtils;
import ru.niir.goodfil.db.*;
import ru.niir.goodfil.db.dic.OperationState;
import ru.niir.goodfil.exceptions.CreateFailureException;
import ru.niir.goodfil.exceptions.GoodfilException;
import ru.niir.goodfil.exceptions.ValidationException;
import ru.niir.goodfil.ui.models.StorageReturnModel;
import ru.niir.goodfil.utils.filters.StorageReturnsFilter;

import javax.faces.model.SelectItem;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class StorageReturnsBean extends PageBean{

    private List<StorageReturnModel> storageReturnModelList;

    private String goodCode;

    private StorageReturnModel storageReturnModel;

    private StorageReturnsFilter storageReturnsFilter;


    public StorageReturnsBean() {
        init();
    }

    public void init(){
        storageReturnModel = new StorageReturnModel();
        storageReturnsFilter = new StorageReturnsFilter();
        initStorageReturnModelList(storageReturnsFilter);
    }

    private void initStorageReturnModelList(StorageReturnsFilter filter){
        // Здесь должно быть получение списка из БД
        storageReturnModelList = new ArrayList<StorageReturnModel>();
        List<StorageReturn> storageReturns = null;
        try {
            storageReturns = gf().getStorageReturns(filter);
        } catch (GoodfilException e) {
            facesError(e.getMessage());
        }
        if(storageReturns == null){
            facesInfo("Нет элементов для отображения");
        }
        else {
            for(StorageReturn storageReturn : storageReturns){
                Client client = gf().getClientById(storageReturn.getClientId());
                User manager = gf().getUserById(client.getManagerId());

                StorageReturnModel storageReturnModel = new StorageReturnModel
                        (
                                storageReturn.getId(),
                                gf().getGoodById(storageReturn.getGoodId()).getCode(),
                                client.getCompanyName(),
                                manager.getFio(),
                                storageReturn.getGoodCount(),
                                storageReturn.getReturnCause(),
                                storageReturn.getComment(),
                                storageReturn.getCreationDate()
                        );
                storageReturnModelList.add(storageReturnModel);
            }
        }
    }

    public void createStorageReturn(){

        if(hasFacesErrors()){
            return;
        }

        StorageReturnModel model = getStorageReturnModel();

        if(StringUtils.isBlank(model.getGoodCode())){
            facesError("Поле \"Код товара\" обязательно для заполнения");
            return;
        }

        Good good = gf().getGoodByCode(model.getGoodCode());

        if(good == null){
            facesError("Товар с таким кодом не найден");
            return;
        }

        if(StringUtils.isBlank(model.getReturnCause())){
            facesError("Поле \"Причина возврата\" обязательно для заполнения");
        }

        if(StringUtils.isBlank(model.getComment())){
            facesError("Поле \"Комментарий\" обязательно для заполнения");
        }

        if(model.getClientId() == -1){
            facesError("Не выбран клиент");
        }

        if(hasFacesErrors()) return;

        //Добавление в базу данных
        try {
            gf().saveStorageReturn(new StorageReturn
                    (
                        good.getId(),
                        model.getClientId(),
                        model.getGoodCount(),
                        Calendar.getInstance().getTime(),
                        model.getReturnCause(),
                        model.getComment()
                    ));
        } catch (ValidationException e) {
            e.printStackTrace();
        } catch (CreateFailureException e) {
            e.printStackTrace();
        }
        // Очистка всех полей
    }

    public void confirm(){
        if(hasFacesErrors()){
            return;
        }
        Good good = gf().getGoodByCode(getStorageReturnModel().getGoodCode().toUpperCase().replaceAll(" ",""));

        if(good == null){
            facesError("Товар с таким кодом не найден");
            return;
        }
        StorageEnterance storageEnterance = new StorageEnterance();
        storageEnterance.setGoodId(good.getId());
        storageEnterance.setGoodCount(getStorageReturnModel().getGoodCount());
        storageEnterance.setDate(Calendar.getInstance().getTime());
        storageEnterance.setComment(getStorageReturnModel().getReturnCause() + " " + getStorageReturnModel().getComment());
        storageEnterance.setUserId(getSecurityBean().getUserId());
        storageEnterance.setOperationType(OperationState.ADD);
        storageEnterance.setGoodTypeId(good.getGoodTypeId());

        try{
            gf().saveStorageEnterance(storageEnterance);
        }catch (Exception e){
            facesError("Произошла непредвиденная ошибка. Попробуйте позже или свяжитесь с администратором.");
            return;
        }
            good.setStorageCount(good.getStorageCount() + getStorageReturnModel().getGoodCount());
        try {
            gf().updateGood(good);
        } catch (ValidationException e) {
            e.printStackTrace();
        }

        StorageReturn storageReturn = gf().getStorageReturnById(getStorageReturnModel().getId());
        storageReturn.setConfirm(true);
        try {
            gf().updateStorageReturn(storageReturn);
        } catch (ValidationException e) {
            facesError("Произошла непредвиденная ошибка. Попробуйте позже или свяжитесь с администратором.");
        }

        reloadData();
    }

    public void reloadData(){
        storageReturnModel = new StorageReturnModel();
    }

    public List<StorageReturnModel> getStorageReturnModelList() {
        return storageReturnModelList;
    }

    public StorageReturnModel getStorageReturnModel() {
        return storageReturnModel;
    }

    public void setStorageReturnModel(StorageReturnModel storageReturnModel) {
        this.storageReturnModel = storageReturnModel;
    }

    public StorageReturnsFilter getStorageReturnsFilter() {
        return storageReturnsFilter;
    }

    public void setStorageReturnsFilter(StorageReturnsFilter storageReturnsFilter) {
        this.storageReturnsFilter = storageReturnsFilter;
    }

    public List<SelectItem> getAllClientsAsSelectItems() {
        List<Client> clients = gf().getClients();
        List<SelectItem> result = new ArrayList<SelectItem>();
        result.add(new SelectItem(-1, "Не выбрано"));
        for (Client client : clients){
            result.add(new SelectItem(client.getId(), client.getCompanyName()));
        }
        return result;
    }

    public void applyFilter(){
        facesInfo("Сообщение");
        initStorageReturnModelList(getStorageReturnsFilter());
    }
}


